import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'
import routers from '../router/index'
import { useUserStore } from '../store/modules/user'
import { errorMsg } from '../utils/message'
import { ElMessage } from 'element-plus'
import {
  showFullScreenLoading,
  tryHideFullScreenLoading,
  showFullScreenLoading2,
} from '@/utils/fullScreen'
//  创建axios实例
const instance = axios.create({
  baseURL: import.meta.env.VITE_HTTP,
  timeout: 180000, //  请求超时时间（毫秒）
})

export interface CustomAxiosRequestConfig extends AxiosRequestConfig {
  loading?: boolean
  text?: boolean
}

//  request拦截器
instance.interceptors.request.use(
  (config: CustomAxiosRequestConfig) => {
    if (
      window.location.host.indexOf('192.168') > -1 ||
      window.location.host.indexOf('localhost') > -1
    ) {
      config.baseURL = import.meta.env.VITE_HTTP
    } else {
      config.baseURL = import.meta.env.VITE_HTTP_WWW
    }
    config.loading ??= false
    config.text ??= false
    if (config.loading) {
      if (config.text) {
        showFullScreenLoading2()
      } else {
        showFullScreenLoading()
      }
    }
    const store = useUserStore()
    //  如果已登录
    if (store.token) {
      //  在请求头添加token
      config.headers['Authorization'] = 'Bearer ' + store.token
    }
    //  统一请求类型json
    config.headers['Content-Type'] = 'application/json'
    return config
  },
  (error) => {
    Promise.reject(error)
  },
)

//  response拦截器
instance.interceptors.response.use(
  (response: AxiosResponse & { config: CustomAxiosRequestConfig }) => {
    const { data, config } = response
    config.loading && tryHideFullScreenLoading()
    //  请求成功，直接返回数据
    if (data.code === 5000 && data.code) {
      ElMessage({ type: 'error', message: '服务器异常' })
      return null
    } else {
      if (data.code === 500 && data.code) {
        ElMessage({ type: 'error', message: data.msg })
        return null
      } else {
        return data
      }
    }
  },
  (error) => {
    const store = useUserStore()
    if (!error.response) {
      errorMsg('服务器异常')
    } else {
      //  请求返回码
      let code
      if (error.response) {
        code = error.response.status
      }
      //  请求返回错误
      const data = error.response.data
      if (code) {
        //  如果是未授权
        if (code === 401) {
          //  说明token过期，使用refreshToken对当前token进行刷新
          const refresh = store.refreshToken
          //  如果存在
          if (refresh) {
            return againRequest(refresh, error)
            //  否则
          } else {
            //  清空token
            store.tokenAction(null)
            //  并跳转到登录页面，进行重新登录
            routers.push({
              path: '/login',
              query: {
                backto: routers.currentRoute.fullPath,
              },
            })
          }
          //  如果是没有权限
        } else if (code === 403) {
          //  直接跳转至401页面
          routers.replace({ path: '/login' })
          //  如果是服务器异常或其他异常
        } else {
          //  如果存在异常信息，显示异常信息
          if (data) {
            errorMsg('服务器异常')
          }
        }
      } else {
        errorMsg('接口请求失败')
      }
    }
    return Promise.reject(error)
  },
)

/**
 * 重新请求
 * @param error
 * @returns {Promise<void>}
 */
async function againRequest(refresh, error) {
  const store = useUserStore()
  await refreshToken(refresh)
  const config = error.response.config
  config.headers['Authorization'] = 'Bearer ' + store.token
  const res = await axios.request(config)
  return res.data
}

/**
 * 刷新token
 * @param refresh
 * @param config
 */
export function refreshToken(refresh) {
  const store = useUserStore()
  //  刷新token
  return axios({
    url: import.meta.env.VITE_HTTP + '/auth/refresh',
    method: 'put',
    headers: {
      Authorization: `Bearer ${refresh}`,
    },
  }).then((res) => {
    if (res.data.success) {
      //  刷新token
      store.tokenAction(res.data.data)
    } else {
      errorMsg(res.msg)
      //  清空token
      store.tokenAction(null)
    }
  })
}

export default instance
